// Path: apps/backend-mock/utils/database.ts
import mysql from 'mysql';

// INSERT/UPDATE/DELETE 操作的返回结果
export interface mysqlOkPacket {
  fieldCount: number; // 数据包中的字段数量
  affectedRows: number; // 受影响的行数（INSERT/UPDATE/DELETE 操作）
  insertId: number; // 新插入行的自增ID（仅INSERT）
  serverStatus: number; // 服务器状态
  warningCount: number; // 服务器返回的警告数量
  message: string; // 服务器返回的消息
  protocol41: boolean; // 是否使用协议4.1
  changedRows: number; // 对于UPDATE操作，返回实际被修改的行数（MySQL 8.0+）
}

// 定义返回结果类型
export type QueryResult =
  | any[] // SELECT/SHOW 查询结果（数组形式）
  | mysqlOkPacket; // INSERT/UPDATE/DELETE 操作结果

// 使用连接池进行管理
const pool = mysql.createPool({
  connectionLimit: 500, // 连接池中连接的数量，不得超过mysql配置的最大连接数
  host: 'localhost',
  user: 'Jans',
  password: 'nE3ah5KYJzyLaBnB',
  database: 'myweb',
  authPlugin: 'mysql_native_password', // 指定认证插件(与mysql端一致)，保持与低版本MySQL兼容
});

/**
 * 参数化查询数据库，防止SQL注入攻击
 * @param queryString 查询语句
 * @param args 参数
 * @returns
 */
// export const queryDatabase = (queryString: string, args: any[]): Promise<QueryResultBase | SelectQueryResult> => {
export const queryDatabase = (queryString: string, args: any[]): Promise<QueryResult> => {
  return new Promise((resolve, reject) => {
    pool.getConnection((err, connection) => {
      if (err) {
        // console.error('数据库连接失败:', err);
        reject(err);
        return;
      }
      // 使用连接执行查询
      connection.query(queryString, args, (error, results) => {
        // 释放连接回连接池
        connection.release();
        if (error) {
          // console.error('处理失败:', error);
          reject(error);
          return;
        }
        resolve(results);
      });
    });
  });
};
